package initialize

import (
	"github.com/gin-gonic/gin"
	"k8soperation/middlewares"
)

type Engine struct {
	*gin.Engine
	Mode string
}

// NewEngine 创建一个新的引擎实例
// 返回一个初始化完成的 Engine 指针
func NewEngine() *Engine {
	// 创建 Engine 实例，并设置运行模式为发布模式
	g := &Engine{
		Mode: gin.ReleaseMode,
	}

	// 设置 Gin 框架的运行模式
	gin.SetMode(g.Mode)

	// 注入中间件
	g.injectMiddlewares()

	// 初始化路由配置
	g.injectRouters()

	return g
}

func (s *Engine) injectMiddlewares() {
	// 初始化并赋值 gin.Engine
	s.Engine = gin.New()

	// 判断是否为测试模式
	if s.Mode == gin.TestMode {
		return
	}

	// 注册中间件
	s.Use(middlewares.Logger())
	s.Use(middlewares.Recovery())
}

func (s *Engine) injectRouters() {
	// 1. 取出已经在 injectMiddlewares() 初始化好的 gin.Engine
	r := s.Engine

	// 2. 创建一个根分组
	//apiRouter 挂的路由，路径就是从根开始，比如 /login、/users。
	//这个是“根级分组”，用来直接注册全局路由。
	apiRouter := r.Group("")

	// 3. 把分组传给 injectRouterGroup，让它批量注册模块路由
	// apiRouter 挂的路由，路径就是从根开始，比如 /login、/users。
	//这个是“根级分组”，用来直接注册全局路由，或者后面再细分子分组。
	s.injectRouterGroup(apiRouter)

	// 4. 再把修改后的 r 赋回 Engine（其实这一步是多余的，因为 r 和 s.Engine 指向的是同一个对象）
	//s.Engine = r
}
